import axios, { type AxiosInstance } from 'axios'
import { ElMessage } from 'element-plus'
import router from '@/router';
import { unLoginOrExpired, userNoPermission } from '@/utils/tipUtils';
import { PageConstant, UserConstant } from '@/common/Constant';
import { BusinessException } from '@/exception/BusinessException';
import { removeToken } from '@/utils/tokenUtils';

// 创建 axios 实例
const service: AxiosInstance = axios.create({
    baseURL: "/api",
    timeout: 10000,
    headers: {
        'Content-Type': 'application/json;charset=utf-8'
    }
});

// 请求拦截器
service.interceptors.request.use(
    config => {
        // 自动携带token
        const token = localStorage.getItem(UserConstant.tokenValue) as string;
        const tokenName = localStorage.getItem(UserConstant.tokenName) as string;
        if (token) {
            config.headers[tokenName] = `${token}`;
        }
        return config;
    },
    error => {
        return Promise.reject(error);
    }
)

// 响应拦截器
service.interceptors.response.use(
    response => {
        const res = response.data;
        if (res.code === 200 && res.success) {
            // 如果data是字符串格式的JSON，需要解析
            if (typeof res.data === 'string') {
                try {
                    return JSON.parse(res.data);
                } catch (e) {
                    console.log(e);
                }
            }
            // 方便调试，打包后会构建好的
            return res.data;
        }

        // 处理特定的错误码
        switch (res.code) {
            case 401: // 未登录或 token 过期
                unLoginOrExpired();
                break;
            case 403: // 权限不足
                ElMessage.error('权限不足');
                break;
            case 500: // 服务器错误
                // 用户无权限操作
                userNoPermission(res);
                throw new BusinessException(res.data);
            default:
                ElMessage.error(res.message || '未知错误');
        }
        return null;
    },
    error => {
        console.error('响应拦截器错误：', error);
        // 处理网络错误
        if (!error.response) {
            ElMessage.error('网络错误，请检查您的网络连接')
            return Promise.reject(error)
        }
        // 处理 HTTP 状态码
        switch (error.response.status) {
            case 401:
                ElMessage.error('登录已过期，请重新登录')
                removeToken();
                router.push(PageConstant.LoginPage)
                break
            case 403:
                ElMessage.error('权限不足')
                break
            case 404:
                ElMessage.error('请求的资源不存在')
                break
            case 500:
                ElMessage.error('服务器错误，请稍后重试')
                break
            default:
                ElMessage.error('未知错误')
        }
        return Promise.reject(error);
    }
)

// 封装请求方法
export const http = {
    get(url: string, params: any) {
        return service.get(url, { params });
    },
    post(url: string, data: any) {
        return service.post(url, data);
    },
    patch(url: string, data: any) {
        return service.patch(url, data);
    },
    delete(url: string, params: any) {
        return service.delete(url, { params });
    }
}

export default service;